/*!
 * @file trie.h
 * @brief trie树相关方法的实现
 * @author Liu Guirong
 * @date 2011.07.11
 */

#ifndef TRIE_H
#define TRIE_H

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include "memory_pool.h"
#include <stdbool.h>
#include <time.h>

#define UINT unsigned int
//#define SCREEN


/*!
 *@param init_mem_num 初始时向系统申请的存放trie结点内存的个数
 *@note 程序结束之前，要调用delete_trie()回收内存 
 *@return 成功返回0 否则返回1
 */
extern 
int init_trie(UINT init_mem_num);




/*!
 *@param subnet [I] 要插入到树的二进制字符串 格式为2.2.2.2/18
 *@param balck [I] 黑名单对应的wildcard 如果为0 说明未启用
 *@param white [I] 白名单对应的wildcard 如果为0 说明未启用
 *@note 向trie树插入一个subnet
 *@return 成功返回0，否则返回1
 */
extern int 
insert_subnet(const char *subnet,UINT black ,UINT white);




/*!
 *@param subnet 要删除的子网串 格式为 2.2.2.2/18
 *@note  从trie树中删除一个子网
 *@return 成功返回0，否则返回非0
 */
extern int
remove_subnet(const char* subnet);




/*!
 * 本函数接收一个网络字节序的ip数值，在trie中查找对应的子网
 * 如果子网存在，则已字符ip/数值（2.2.2.2/20）的格式存入到
 * 用户指定的缓存subnet中，要注意缓冲的长度要大于等于20，因为
 * 200.200.200.200/20是最长的返回形式，需要20个字符空间。另外
 * 使用时，一定要先判断返回值，如果返回0 ，则说明找到子网，subnet
 * 中有值，如果返回值不为0 ，则没找到，subnet中什么都没有
 *@param uip [I] 要查找的IP整数值
 *@param subnet [o] 得到的子网号缓冲,缓冲长度要大于等于20
 *@param balck [O]  黑名单对应的wildcard 如果为0 说明未启用
 *@param white [O] 白名单对应的wildcard 如果为0 说明未启用
 *返回结果为2.2.2.2/20格式
 *@return 成功得到子网号返回1 否则返回0
 */
extern int 
get_subnet(UINT uip ,char *subnet,UINT *black ,UINT *white);



/*!
 *@param input_str [I] 要修改的网络二进制字符串 格式为2.2.2.2/18
 *@param balck [I] 黑名单对应的wildcard 
 *@param white [I] 白名单对应的wildcard 
 *@note 修改trie树一个subnet
 *@return 成功返回0，否则返回1
 */
extern int
modify_subnet(const char* input_str ,UINT black,UINT white);

/*!
 *@return 成功返回0 ，否则返回1
 *@note 回收trie树的内存
 */
extern int 
delete_trie();

#endif


